package com.colorlight.cloud.gateway.api.message.interceptor.trans;

import com.colorlight.cloud.gateway.api.exception.ReflexException;
import com.google.protobuf.Message;

import java.lang.reflect.Field;
import java.util.Objects;

/**
 * @author Demon
 * 拦截器：与protobuf强耦合  根据转化加入
 * @date 18/12/2023  下午4:36
 */
public interface TransToProtoInterceptor {
	/**
	 * 拦截器入口 判断条件
	 * @param aClass 参数类型，过滤器入口
	 * @author Demon
	 * @date 18/12/2023/下午5:36
	 * @return
	 */
	Boolean isInterceptor(Class<?> aClass);
	/**
	 * 根据名字获取当前方法的set方法
	 *
	 * @param name 属性名
	 * @author Demon
	 * @date 17/12/2023/下午3:48
	 * @return 方法名
	 */
	default String getMethodName(String name){
		if (Objects.isNull(name) || name.length() == 0) {
			throw new ReflexException("sdk转化方法名异常");
		}
		return "set" + Character.toUpperCase(name.charAt(0)) + name.substring(1);
	}
	/**
	 *  添加属性
	 * @throws NullPointerException 存在异常，详情看代码
	 * @param builder 目标对象
	 * @param value 参数属性
	 * @param inputClass  反射调用方法入参类型
	 * @param methodName 方法名
	 * @author Demon
	 * @date 18/12/2023/下午5:42
	 */
	void addAttribute(Message.Builder builder, Object value, Class<?> inputClass, String methodName) ;
	/**
	 * 参数类型转化：反射调用方法入参类型
	 * @param field 原始参数对象
	 * @author Demon
	 * @date 18/12/2023/下午5:44
	 * @return 反射调用方法入参类型
	 */
	Class<?> getInputClass(Field field);
}
